home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 223_01 / cc21.c < prev    next >
Text File  |  1980-01-01  |  6KB  |  280 lines

  1. junk() {
  2.   if(an(inbyte())) while(an(ch)) gch();
  3.   else while(an(ch)==0) {
  4.     if(ch==0) break;
  5.     gch();
  6.     }
  7.   blanks();
  8.   }
  9.  
  10. endst() {
  11.   blanks();
  12.   return ((streq(lptr,";")|(ch==0)));
  13.   }
  14.  
  15. illname() {
  16.   error("illegal symbol");
  17.   junk();
  18.   }
  19.   
  20.  
  21. multidef(sname)  char *sname; {
  22.   error("already defined");
  23.   }
  24.  
  25. needtoken(str)  char *str; {
  26.   if (match(str)==0) error("missing token");
  27.   }
  28.  
  29. needlval() {
  30.   error("must be lvalue");
  31.   }
  32.  
  33. findglb(sname)  char *sname; {
  34.   if(search(sname, STARTGLB, SYMMAX, ENDGLB, NUMGLBS, NAME))
  35.     return cptr;
  36.   return 0;
  37.   }
  38.  
  39. findloc(sname)  char *sname;  {
  40.   cptr = locptr - 1;  /* search backward for block locals */
  41.   while(cptr > STARTLOC) {
  42.     cptr = cptr - *cptr;
  43.     if(astreq(sname, cptr, NAMEMAX)) return (cptr - NAME);
  44.     cptr = cptr - NAME - 1;
  45.     }
  46.   return 0;
  47.   }
  48.  
  49. addsym(sname, id, typ, level, itype, arrindex, value, lgptrptr, class)
  50.   char *sname, id, typ, level, itype, arrindex; int value, *lgptrptr, class;{
  51.                         /* fas 2.3 2.6 */
  52.   if(lgptrptr == &glbptr) {
  53.     if(cptr2=findglb(sname)) return cptr2;
  54.     if(cptr==0) {
  55.       error("global symbol table overflow");
  56.       return 0;
  57.       }
  58.     }
  59.   else {
  60.     if(locptr > (ENDLOC-SYMMAX)) {
  61.       error("local symbol table overflow");
  62.       abort(ERRCODE);
  63.       }
  64.     cptr = *lgptrptr;
  65.     }
  66.   cptr[IDENT]=id;
  67.   cptr[TYPE]=typ;
  68.   cptr[CLASS]=class;
  69.   cptr[LEVEL]=level;                    /* fas 2.3 */
  70.   cptr[ITYPE]=itype;                    /* fas 2.3 */
  71.   cptr[AINDEX]=arrindex;                /* fas 2.6 */
  72.   putint(value, cptr+OFFSET, OFFSIZE);
  73.   cptr3 = cptr2 = cptr + NAME;
  74.   while(an(*sname)) *cptr2++ = *sname++;
  75.   if(lgptrptr == &locptr) {
  76.     *cptr2 = cptr2 - cptr3;         /* set length */
  77.     *lgptrptr = ++cptr2;
  78.     }
  79.   return cptr;
  80.   }
  81.  
  82. nextsym(entry) char *entry; {
  83.   entry = entry + NAME;
  84.   while(*entry++ >= ' '); /* find length byte */
  85.   return entry;
  86.   }
  87.  
  88. /*
  89. ** get integer of length len from address addr
  90. ** (byte sequence set by "putint")
  91. */
  92. getint(addr, len) char *addr; int len; {
  93.   int i;
  94.   i = *(addr + --len);  /* high order byte sign extended */
  95.   while(len--) i = (i << 8) | *(addr+len)&255;
  96.   return i;
  97.   }
  98.  
  99. /*
  100. ** put integer i of length len into address addr
  101. ** (low byte first)
  102. */
  103. putint(i, addr, len) char *addr; int i, len; {
  104.   while(len--) {
  105.     *addr++ = i;
  106.     i = i>>8;
  107.     }
  108.   }
  109.  
  110. /*
  111. ** test if next input string is legal symbol name
  112. */
  113. symname(sname, ucase) char *sname; int ucase; {
  114.   int k;char c;
  115.   blanks();
  116.   if(alpha(ch)==0) return (*sname=0);   /*19*/
  117.   k=0;
  118.   while(an(ch)) {
  119. #ifdef UPPER
  120.     if(ucase)
  121.       sname[k]=toupper(gch());
  122.     else
  123. #endif
  124.       sname[k]=gch();
  125.     if(k<NAMEMAX) ++k;
  126.     }
  127.   sname[k]=0;
  128.   return 1;
  129.   }
  130.  
  131. /*
  132. ** return next avail internal label number
  133. */
  134. getlabel() {
  135.   return(++nxtlab);
  136.   }
  137.  
  138. /*
  139. ** post a label in the program
  140. */
  141. postlabel(label) int label; {
  142.   printlabel(label);
  143.   col();
  144.   nl();
  145.   }
  146.  
  147. /*
  148. ** print specified number as a label
  149. */
  150. printlabel(label)  int label; {
  151.   outstr("CC");
  152.   outdec(label);
  153.   }
  154.  
  155. /*
  156. ** test if c is alphabetic
  157. */
  158. alpha(c)  char c; {
  159.   return (isalpha(c) || c=='_');
  160.   }
  161.  
  162. /*
  163. ** test if given character is alphanumeric
  164. */
  165. an(c)  char c; {
  166.   return (alpha(c) || isdigit(c));
  167.   }
  168.  
  169. addwhile(ptr)  int ptr[]; {
  170.   int k;
  171.   ptr[WQSP]=csp;           /* and stk ptr */
  172.   ptr[WQLOOP]=getlabel();  /* and looping label */
  173.   ptr[WQEXIT]=getlabel();   /* and exit label */
  174.   if (wqptr==WQMAX) {
  175.     error("too many active loops");
  176.     abort(ERRCODE);
  177.     }
  178.   k=0;
  179.   while (k<WQSIZ) *wqptr++ = ptr[k++];
  180.   }
  181.  
  182. delwhile() {
  183.   if (wqptr > wq) wqptr=wqptr-WQSIZ;                 /*01*/
  184.   }
  185.  
  186. readwhile(ptr) int *ptr; {                           /*01*/
  187.   if (ptr <= wq) {                                   /*01*/
  188.     error("out of context");                         /*01*/
  189.     return 0;
  190.     }
  191.   else return (ptr-WQSIZ);                           /*01*/
  192.  }
  193.  
  194. white() {
  195. #ifdef DYNAMIC
  196.   /* test for stack/prog overlap at deepest nesting */
  197.   /* primary -> symname -> blanks -> white */
  198.   avail(YES);  /* abort on stack overflow */   /*31*/
  199. #endif
  200.   return (*lptr<= ' ' && *lptr!=NULL);         /*19*/
  201.   }
  202.  
  203. gch() {
  204.   int c;
  205.   if(c=ch) bump(1);
  206.   return c;
  207.   }
  208.  
  209. bump(n) int n; {
  210.   if(n) lptr=lptr+n;
  211.   else  lptr=line;
  212.   if(ch=nch = *lptr) nch = *(lptr+1);
  213.   }
  214.  
  215. kill() {
  216.   *line=0;
  217.   bump(0);
  218.   }
  219.  
  220. inbyte()  {
  221.   while(ch==0) {
  222.     if (eof) return 0;
  223.     preprocess();
  224.     }
  225.   return gch();
  226.   }
  227.  
  228.  
  229. inline() {
  230.   int k,unit;
  231.  
  232.   poll(1);  /* allow program interruption */
  233.  
  234.   while(1) {
  235.     if (input == EOF) openin();
  236.     if(eof) return;
  237.  
  238.     if(inclevel){                /* fas 2.7 */
  239.        if((unit=input2[inclevel]) == EOF)    /* fas 2.7 */
  240.          unit=input2[--inclevel];        /* fas 2.7 */
  241.     }else{                     /* fas 2.7 */
  242.        unit=input;                /* fas 2.7 */
  243.     }                        /* fas 2.7 */
  244.  
  245.     if(xgets(line, LINEMAX, unit)==NULL) {
  246.       fclose(unit);
  247.       if(inclevel){                /* fas 2.7 */
  248.          if(input2[inclevel] != EOF)        /* fas 2.7 */
  249.             input2[inclevel--] = EOF;        /* fas 2.7 */
  250.          }else  input = EOF;
  251.       }
  252.     else {
  253.       bump(0);
  254.       return;
  255.       }
  256.     }
  257.   }
  258.  
  259.  
  260. /*
  261.  * special version of 'fgets' that deletes trailing '\n'
  262.  */
  263. xgets(string, len, fd) char *string; int len, fd; {
  264.  
  265.   char c, *strptr;
  266.   strptr = string;
  267.   while ((((c = getc(fd)) & 127) != '\n') && (--len)) {
  268.     if (c == EOF) return NULL;
  269.     if (c == 8){                /* fas 2.2 */
  270.       len++;
  271.       string--;
  272.     }else{
  273.       *string++ = c & 127;  /* mask parity off */
  274.       }
  275.     }
  276.   *string = NULL;
  277.   return strptr;
  278.   }
  279.  
  280.